/* 公共模块 */
layui.define(['jquery', 'element', 'form', 'setter'], function (exports) {
    var config = layui.setter,
        $ = layui.jquery,
        element = layui.element
    var P = {
        // 容器
        container: document,
        isDOM: (typeof HTMLElement === 'object') ?
            function (obj) {
                return obj instanceof HTMLElement;
            } :
            function (obj) {
                return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
            },
        S: {
            set: function (key, value) {
                if (!window.localStorage) {
                    console.log('浏览器不支持localStorage');
                    return false;
                }
                return window.localStorage.setItem(key, value);
            },
            del: function (key) {
                if (!window.localStorage) {
                    console.log('浏览器不支持localStorage');
                    return false;
                }
                return window.localStorage.removeItem(key);
            },
            get: function (key) {
                if (!window.localStorage) {
                    console.log('浏览器不支持localStorage');
                    return false;
                }
                return window.localStorage.getItem(key);
            }
        },
        tabCache: {
            key: 'icy8_tabs',
            set: function (id, opm) {
                var data = P.S.get(this.key) || '{}';
                data = ICY8.str2json(data);
                if (data[id]) {
                    $.extend(data[id], opm);
                } else {
                    data[id] = opm || {};
                }
                if (opm.is_this) {
                    $.each(data, function (index, elem) {
                        if (index != id && data[index]) {
                            data[index].is_this = false;
                        }
                    })
                }
                return P.S.set(this.key, ICY8.json2str(data));
            },
            get: function (key) {
                if (!key) {
                    return ICY8.str2json(P.S.get(this.key) || '{}');
                }
                var data = ICY8.str2json(P.S.get(this.key) || '{}');
                return data[key];
            },
            del: function (key) {
                var data = ICY8.str2json(P.S.get(this.key) || '{}');
                delete data[key];
                return P.S.set(this.key, ICY8.json2str(data));
            }
        },
        // 简单事件
        events: $.extend(true, config.events, {
            // 点击事件
            click: {
                addWindow: function () {
                    P.addWindow(this, element);
                    return false;
                }
            }
        }),
        tab: {
            getTab: function (filter, id) {
                var find = '.layui-tab[lay-filter="' + filter + '"] .layui-tab-title li[lay-id="' + id + '"]';
                return $(find, P.container);
            },
            getCurrent: function (filter) {
                var find = '.layui-tab[lay-filter="' + filter + '"] .layui-tab-title li.layui-this';
                return $(find, P.container);
            },
            deleteThis: function (filter) {
                var item = $('.layui-tab[lay-filter="' + filter + '"] .layui-tab-title li.layui-this', P.container);
                var id = $(item, P.container).attr('lay-id');
                P.tabCache.del(id);
                element.tabDelete(filter, id);
            },
            deleteOther: function (filter, not) {
                not += ',.layui-this';
                var tabs = $('.layui-tab[lay-filter="' + filter + '"] .layui-tab-title li', P.container).not(not);
                $.each(tabs, function (i, item) {
                    var id = $(item, P.container).attr('lay-id');
                    P.tabCache.del(id);
                    element.tabDelete(filter, id);
                });
            },
            deleteAll: function (filter, not) { //删除所有
                var tabs = $('.layui-tab[lay-filter="' + filter + '"] .layui-tab-title li', P.container).not(not);
                $.each(tabs, function (i, item) {
                    var id = $(item, P.container).attr('lay-id');
                    P.tabCache.del(id);
                    element.tabDelete(filter, id);
                })
            },
        },
        /**
         * 窗口滚动
         * @param dir 滚动方向
         */
        rollTab: function (dir) {
            var bar = $('.layui-tab[lay-filter="' + config.tabCardFilter + '"] .layui-tab-title', P.container), // 选项卡Dom
                containerWidth = bar.outerWidth(), // 容器宽度
                fleft = parseInt(bar.css('left')), // X轴浮动
                maxLeft = 0,                       // 默认容器可见部分的最左端
                maxRight = containerWidth,         // 默认容器可见部分的最右端
                flag = false,
                range = 1 //误差范围
            if (fleft < 0) {
                // 如果已经相对移动
                maxRight = containerWidth - fleft;
                maxLeft = maxRight - containerWidth;
            }
            $('li', bar).each(function () {
                // 查询最近的选项卡
                if (flag) return false;
                var w = $(this, P.container).outerWidth(),
                    offsetLeft = parseInt($(this, P.container).position().left),
                    condition = false
                if (dir == 'left') {
                    condition = (offsetLeft < maxLeft && offsetLeft + w > maxLeft) || (offsetLeft + w == maxLeft) || (offsetLeft - range <= maxLeft && offsetLeft + w > maxLeft); // 卡片穿梭了最左端或者卡片的最右端恰好等于容器最左端 时
                } else {
                    condition = (offsetLeft < maxRight && offsetLeft + w > maxRight) || (offsetLeft == maxRight) || (offsetLeft - range <= maxRight && offsetLeft + w > maxRight); // 卡片穿梭了最右端或者卡片的最左端恰好等于容器最右端 时
                }
                if (condition) {
                    P.switchTabs($(this, P.container).attr('lay-id'), dir); // 开始切换卡片
                    flag = true;
                }
            });
        },
        /**
         * 新建窗口
         * @param obj 点击对象
         * @param elem layui的元素对象
         */
        addWindow: function (obj, elem) {
            var is_this = true;
            if (P.isDOM(obj)) {
                var data = $(obj);
                var href = id = data.attr('_href');
            } else if(typeof obj =='object') {
                var href = obj.url;
                var id = obj.id;
                is_this = obj.is_this;
            }else {
                console.log('非法参数');
                return false;
            }
            var loadText = '<span>加载中...</span>';// 加载时的默认标题
            if (href) {
                var find = '.layui-tab[lay-filter="' + config.tabCardFilter + '"] .layui-tab-title li[lay-id="' + id + '"]',
                    is = $(find, P.container).length;
                if (is <= 0) {
                    var dom = '<iframe tab-id="' + id + '" frameborder="0" src="' + href + '" scrolling="yes" class="icy8Iframe"></iframe>';
                    elem.tabAdd(config.tabCardFilter, {
                        'title': loadText,
                        'content': dom,
                        'id': id,
                    });
                    P.tabCache.set(id, {id: id, url: href, is_this: is_this});
                }
                var con = $('iframe[tab-id="' + id + '"]', P.container);
                if (con.length > 0) {
                    // 动态改变窗口标题
                    $(con[0]).load(function () {
                        var id = $(this).attr('tab-id'); // 解决同时打开多个窗口出现只有一个窗口有标题的问题 2019 01 14
                        P.pullTitle(this.contentWindow.document, id);
                    });
                }
                if (is_this) {
                    elem.tabChange(config.tabCardFilter, id);
                }
                P.switchTabs(id);
            }
        },
        pullTitle: function (con, id) {
            // 标题处理函数
            var noTitle = '无标题'// 标题为空时显示
            var title = $('title', con).text();
            if (!title)
                title = noTitle;
            P.changeTitle(title, id);
        },
        changeTitle: function (title, id) {
            var find = '.layui-tab[lay-filter="' + config.tabCardFilter + '"] .layui-tab-title li[lay-id="' + id + '"]';
            // 删除关闭按钮以外的所有元素
            $(find, P.container).children('.layui-tab-close').siblings().remove();
            // 加入新标题
            $(find, P.container).children('.layui-tab-close').before('<span>' + title + '</span>');
            $(find, P.container).attr('title', title);
        },
        /**
         * 窗口切换
         * @param id 窗口id
         * @param dir 切换方向 默认为向右
         * @returns {boolean}
         */
        switchTabs: function (id, dir) {
            var bar = $('.layui-tab[lay-filter="' + config.tabCardFilter + '"] .layui-tab-title', P.container),
                containerWidth = bar.outerWidth(),
                obj = this.tab.getTab(config.tabCardFilter, id),
                of = obj.position(), // 相对元素偏移
                w = obj.outerWidth();// 窗口真实宽度（内外）
            if (!dir)
                dir = 'right';
            if (obj.length <= 0) {
                console.log('没有找到对应窗口');
                return false;
            } else if (of.left + w >= containerWidth) {
                var l = containerWidth - of.left - w;  // 相对移动
                if (dir == 'left')
                    l = -of.left;
                bar.css('left', l + 'px');
            } else {
                var l = -of.left;
                if (parseInt(bar.css('left')) < 0 && l <= 0) {
                    bar.css('left', l + 'px');          // 回到最初可视范围
                }
            }
        },
        // 简单事件监听
        listenSimpleEvent: function () {
            $.each(this.events, function (i, elem) {
                $('[icy8-' + i + '-event]').each(function () {
                    var e = $(this).attr('icy8-' + i + '-event');
                    if (e)
                        $(this).on(i, P.events[i][e]);
                });
            });
        }
    };
    exports('common', P);
});